/*----------------------------------------------------------------------------------------
*
*  Copyright 2019, Gao Hai Hui, <fromzeropoint@126.com>.  All rights reserved.
*  https://gitee.com/helloworldghh/xoskit.git
*  Use of this source code is governed by a MIT license
*  that can be found in the License file.
*
----------------------------------------------------------------------------------------*/
#include "../import/head.h"
#include "../data_struct/head.h"
#include "../impl/head.h"
#include "odbc_connect_pool.h"

namespace xos_odbc
{
    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    static odbc_connect_pool::ITEM_DATA xos_item_data;

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //

    odbc_connect_pool::odbc_connect_pool()
    {
        init_data();
    }

    odbc_connect_pool::~odbc_connect_pool()
    {
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // public method

    int odbc_connect_pool::get_xos_item_data( ITEM_DATA*& item_ptr )
    {
        int ret = 0;
        xos_item_data.set_container( mgr::container() );
        item_ptr = &xos_item_data;
        return ret;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int odbc_connect_pool::set_connect_str( const char * lpszConnectStr )
    {
        int ret = 0;
        m_connect_str = lpszConnectStr;
        return ret;
    }

    int odbc_connect_pool::put( i_connect *& pConnect )
    {
        xos_stl::auto_lock<xos_box::i_list> lock( m_pConnectList );
        int ret = 0;
        if( pConnect )
        {
            m_pConnectList->push_back( pConnect );
            pConnect = 0;
        }
        return ret;
    }

    i_connect * odbc_connect_pool::get()
    {
        i_connect * pRet = 0;
        if( !pRet )
        {
            xos_stl::auto_lock<xos_box::i_list> lock( m_pConnectList );
            pRet = (i_connect*)m_pConnectList->front(0);
            if( pRet )
            {
                m_pConnectList->pop_front();
            }
        }
        if( !pRet )
        {
            mgr::get()->connect( 0, m_connect_str.c_str(), &pRet );
        }
        return pRet;
    }

    //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int odbc_connect_pool::init_data()
    {
        int ret = 0;
        m_pConnectList = 0;
        m_connect_str = "";
        return ret;
    }

    /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    // 

    int odbc_connect_pool::init()
    {
        int ret = 0;
        m_pConnectList = mgr::container()->box()->list();
        return ret;
    }

    int odbc_connect_pool::term()
    {
        int ret = 0;
        xos_stl::release_interface( m_pConnectList );
        init_data();
        return ret;
    }

} // xos_odbc
